
package LogicaClasesNew;


import Logica.exceptions.NonexistentEntityException;
import Logica.exceptions.PreexistingEntityException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;


public class ControladorProveedor implements IcontroladorProveedor {

 //private EntityManagerFactory emf;
 private IcontroladorProducto ICP;
 
        public ControladorProveedor() {
           }

       //Nos trae el factory en su instancia actual, luego hace un get de persistencia y crea un entity y devuelve eso.
        public EntityManager getEntityManager() {
               Fabrica factory = Fabrica.getInstance(); 
               return factory.getEmf().createEntityManager();
           }

       public void createProveedor(String Compania, String Web, String Nickname, String Nombre, String Apellido, String FechNacim, String password, String Mail) throws PreexistingEntityException, Exception {
  
               Proveedor proveedor =new Proveedor(Compania, Web, Nickname, Nombre, Apellido, FechNacim, password, Mail);

               EntityManager em = null;

               try {
                   em = getEntityManager();
                   em.getTransaction().begin();
                   em.persist(proveedor);
                   em.getTransaction().commit();
               } 
               catch (Exception t){
               //CAPTURA el error... y...
                StackTraceElement[] trace = new StackTraceElement[] {
                new StackTraceElement("ClassName","methodName","fileName",5)
               };

                //... y ... lo devuelve para que el swing lo capte en una ventanita pechocha!
                   t.setStackTrace(trace);
                   throw t;

               }
               finally {
                   if (em != null) {
                       em.close();
                   }
               }
           }
       
       public void createProveedor2(String Compania, String Web, String Nickname, String Nombre, String Apellido, String FechNacim, String password, String Mail, byte[] Foto) throws PreexistingEntityException, Exception {
  
               Proveedor proveedor =new Proveedor(Compania, Web, Nickname, Nombre, Apellido, FechNacim, password, Mail, Foto);

               EntityManager em = null;

               try {
                   em = getEntityManager();
                   em.getTransaction().begin();
                   em.persist(proveedor);
                   em.getTransaction().commit();
               } 
               catch (Exception t){
               //CAPTURA el error... y...
                StackTraceElement[] trace = new StackTraceElement[] {
                new StackTraceElement("ClassName","methodName","fileName",5)
               };

                //... y ... lo devuelve para que el swing lo capte en una ventanita pechocha!
                   t.setStackTrace(trace);
                   throw t;

               }
               finally {
                   if (em != null) {
                       em.close();
                   }
               }
           }
       
           private void editProveedor(Proveedor prove) throws NonexistentEntityException, Exception {
               
             //  Proveedor prove = findProveedor(Nickname);
               
               System.out.println ("Entra a dar editar el proveedor : " + prove.getNombre());
               
               EntityManager em = null;
               
               try {
                   em = getEntityManager();
                   em.getTransaction().begin();
                   prove = em.merge(prove);
                   em.getTransaction().commit();
               } catch (Exception ex) {
                   String msg = ex.getLocalizedMessage();
                   if (msg == null || msg.length() == 0) {
                       String Nickname = prove.getNickname();
                       if (findProveedor(Nickname) == null) {
                           throw new NonexistentEntityException("The proveedor with id " + Nickname + " no longer exists.");
                       }
                   }
                   throw ex;
               } finally {
                   if (em != null) {
                       em.close();
                   }
               }
           }/*

           public void destroy(String Nickname) throws NonexistentEntityException {
               EntityManager em = null;
               try {
                   em = getEntityManager();
                   em.getTransaction().begin();
                   Proveedor proveedor;
                   try {
                       proveedor = em.getReference(Proveedor.class, Nickname);
                       proveedor.getNickname();
                   } catch (EntityNotFoundException enfe) {
                       throw new NonexistentEntityException("The proveedor with id " + Nickname + " no longer exists.", enfe);
                   }
                   em.remove(proveedor);
                   em.getTransaction().commit();
               } finally {
                   if (em != null) {
                       em.close();
                   }
               }
           }*/
           public Proveedor findProveedor(String Nickname) {
               EntityManager em = getEntityManager();
               try {
                   return em.find(Proveedor.class, Nickname);
               } finally {
                   em.close();
               }
           }

           public List<Proveedor> findProveedorEntities() {
               return findProveedorEntities(true, -1, -1);
           }

           public List<Proveedor> findProveedorEntities(int maxResults, int firstResult) {
               return findProveedorEntities(false, maxResults, firstResult);
           }

           private List<Proveedor> findProveedorEntities(boolean all, int maxResults, int firstResult) {
               EntityManager em = getEntityManager();
               try {
                   CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
                   cq.select(cq.from(Proveedor.class));
                   Query q = em.createQuery(cq);
                   if (!all) {
                       q.setMaxResults(maxResults);
                       q.setFirstResult(firstResult);
                   }
                   return q.getResultList();
               } finally {
                   em.close();
               }
           }
             /*  public int getProveedorCount() {
               EntityManager em = getEntityManager();
               try {
                   CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
                   Root<Proveedor> rt = cq.from(Proveedor.class);
                   cq.select(em.getCriteriaBuilder().count(rt));
                   Query q = em.createQuery(cq);
                   return ((Long) q.getSingleResult()).intValue();
               } finally {
                   em.close();
               }
           }*/
           public void addProductoProveedor(int numRefprod,String Nickname) throws NonexistentEntityException, Exception {
              //System.out.println("Entro a la operacion tengo numrefProd "+ numRefprod + "al proveedor " + Nickname);
                        
                    getInstanciaforICP();
                        
                    Proveedor prove = findProveedor(Nickname);
                        
                    Producto prod = ICP.findProducto(numRefprod);
                        
                        //Proveedor prove = findProveedor(Nickname);
                       // Producto prod = ICP.findProducto(numRefprod);
                     prove.addproducto(prod);
                    /*
                     for (int i=0; i<prove.getlistaproductos().size(); i++){
                         System.out.println("Tiene Prod: " + prove.getlistaproductos().get(i).getNombre() );
                     }*/
              // System.out.println("Proveedor trae el :" + prove.getApellido() + "Producto trae el : " + prod.getNombre() );
                     editProveedor(prove);
                     
           }
           
         public void RemoveProductoProveedor(int numRefprod, String Nickname){
         
                    getInstanciaforICP();
                        
                    Proveedor prove = findProveedor(Nickname);
                        
                    Producto prod = ICP.findProducto(numRefprod);
         
                    prove.removeProducto(prod);
         
                    try {
                        editProveedor(prove);
                    } catch (Exception ex) {
                        Logger.getLogger(ControladorProveedor.class.getName()).log(Level.SEVERE, null, ex);
                    }
         }
           
           private IcontroladorProducto getInstanciaforICP(){
               Fabrica fab = Fabrica.getInstance();
               this.ICP = fab.getControladorProducto();
               return ICP;
           }

        public  List<Producto> getListadoProductosXproveedor(String Nickname){
        
            Proveedor prove = findProveedor(Nickname);
            
            return prove.getlistaproductos();
        }

}
